TCP 三次握手与四次挥手深度解析
核心特性
TCP (Transmission Control Protocol) 是一种 面向连接的、可靠的、基于字节流 的传输层通信协议。
- 可靠性:通过序列号、确认应答、超时重传、流量控制、拥塞控制实现。
- 全双工:通信双方可以同时发送和接收数据。
一、三次握手:建立连接
1. 图解流程
三次握手的本质是 确认双方的收发能力正常,并 同步初始序列号 (ISN)。
- 第一次 (SYN):客户端发送
SYN,告诉服务器:"我想和你建立连接,我的初始序列号是 x"。 - 第二次 (SYN+ACK):服务器返回
SYN+ACK,告诉客户端:"收到了,我也想建立连接,我的初始序列号是 y,我已经准备好接收你第 x+1 个字节了"。 - 第三次 (ACK):客户端返回
ACK,告诉服务器:"收到了,我已经准备好接收你第 y+1 个字节了"。
2. 面试高频:为什么需要三次?
- 两次不够:无法确认客户端的接收能力;且可能导致"已失效的连接请求"到达服务器后,服务器单方面建立连接造成资源浪费。
- 四次多余:三次已经足够让双方确认收发能力并同步序列号,四次会降低效率。
二、TLS/SSL 握手:建立安全通道
前置知识
HTTPS = HTTP + TLS/SSL。在 TCP 连接建立后,如果需要加密通信(HTTPS),会先进行 TLS 握手,然后再传输 HTTP 数据。
📖 详细内容请查看:TLS/SSL 握手与安全通信
1. 为什么需要 TLS/SSL?
HTTP 是明文传输,存在窃听、篡改、冒充三大风险。TLS 通过以下机制解决:
- 机密性:通过对称加密防止数据被窃听
- 完整性:通过 MAC 消息认证码防止数据被篡改
- 身份认证:通过数字证书防止中间人攻击
2. 握手流程概览
TLS 握手分为四个阶段(详见 TLS/SSL 握手文档):
- Client Hello:客户端发送支持的 TLS 版本、加密套件、随机数
- Server Hello + Certificate:服务器返回选定的参数、证书和随机数
- 密钥交换:客户端验证证书,生成 Pre-Master Secret 并用公钥加密发送
- Finished:双方推导 Session Key,验证握手完整性,开始加密通信
3. 核心要点速览
| 特性 | 说明 |
|---|---|
| 加密方式 | 握手阶段用非对称加密交换密钥,数据传输用对称加密 |
| 三个随机数 | Client Random + Server Random + Pre-Master Secret → Session Key |
| TLS 1.2 | 2-RTT(两次往返) |
| TLS 1.3 | 1-RTT(一次往返),支持 0-RTT 会话复用 |
| 会话复用 | Session ID / Session Ticket / 0-RTT |
三、四次挥手:释放连接
1. 图解流程
由于 TCP 是 全双工 的,关闭连接需要双方分别确认,因此通常需要四次交互。
- 第一次 (FIN):客户端发送
FIN,表示:"我不再发送数据了,但还可以接收"。 - 第二次 (ACK):服务器返回
ACK,表示:"收到了,请稍等,我还有数据没发完(进入CLOSE_WAIT状态)"。 - 第三次 (FIN):服务器发完数据后,发送
FIN,表示:"我也发完了,准备关闭"。 - 第四次 (ACK):客户端返回
ACK,表示:"收到了,你关吧"。
2. 面试高频:为什么需要 TIME_WAIT (2MSL)?
主动关闭方在发送完最后一个 ACK 后,必须进入 TIME_WAIT 状态并等待 2MSL(报文最大生存时间的 2 倍)。
- 确保 ACK 到达:如果最后一个 ACK 丢失,服务器会重传 FIN,客户端需保持连接以重发 ACK。
- 清理旧报文:确保本次连接产生的所有报文在网络中彻底消失,防止干扰下一个新连接。
四、安全与性能:SYN Flood 攻击
1. 攻击原理
攻击者发送大量 SYN 报文但不回复最后一个 ACK,导致服务器的 半连接队列 (SYN Backlog) 被占满,正常用户无法连接。
2. 防御措施 (SYN Cookies)
- 原理:服务器收到
SYN时不立即分配资源,而是根据计算结果生成一个Cookie作为序列号返回。 - 结果:只有收到合法的
ACK且Cookie验证通过后,服务器才会分配资源建立连接。
五、完整流程总结:从 URL 到 HTTPS 页面
``mermaid sequenceDiagram participant C as 客户端 participant S as 服务器
Note over C,S: 1️⃣ DNS 解析
C->>C: 查询域名 IP
Note over C,S: 2️⃣ TCP 三次握手
C->>S: SYN
S->>C: SYN+ACK
C->>S: ACK
Note over C,S: 3️⃣ TLS 握手(HTTPS)
C->>S: Client Hello
S->>C: Server Hello + Certificate
C->>S: Key Exchange
C->>S: Finished
S->>C: Finished
Note over C,S: 4️⃣ HTTP 请求
C->>S: GET /index.html (加密)
S->>C: 200 OK + HTML (加密)
Note over C,S: 5️⃣ TCP 四次挥手
C->>S: FIN
S->>C: ACK
S->>C: FIN
C->>S: ACK
---
## 六、面试通关:标准回答
> **面试官:请详细描述 TCP 三次握手过程?**
>
> **标准回答:**
> 1. **第一次**:客户端发送 SYN 包,进入 SYN_SENT 状态,同步 ISN。
> 2. **第二次**:服务器返回 SYN+ACK 包,进入 SYN_RCVD 状态,确认客户端 ISN 并同步自身 ISN。
> 3. **第三次**:客户端发送 ACK 包,双方进入 ESTABLISHED 状态。
> **总结**:三次握手确保了双方都具备正常的发送和接收能力,并初始化了序列号,为可靠传输打下基础。
> **面试官:为什么挥手要四次,而握手只需三次?**
>
> **标准回答:**
> 1. 握手时,服务器可以将 `SYN`(建立连接)和 `ACK`(确认收到)合并在一个包中发送。
> 2. 挥手时,当服务器收到 `FIN` 时,它可能还有未处理完的数据要发送,所以只能先回一个 `ACK` 表示收到。等数据发完后,服务器才发送自身的 `FIN`,因此这两步通常是分开的,导致了四次挥手。
> **面试官:HTTPS 是如何保证安全的?TLS 握手过程是怎样的?**
>
> **标准回答:**
> 1. **安全机制**:HTTPS 通过 TLS/SSL 提供机密性(对称加密)、完整性(MAC 校验)、身份认证(数字证书)。
> 2. **握手流程**:Client Hello → Server Hello + Certificate → 密钥交换 → Finished。详见 [TLS/SSL 握手文档](/http/tls-ssl-handshake)。
> 3. **加密方式**:握手阶段使用非对称加密交换密钥,数据传输阶段使用对称加密(性能更高)。
> 4. **优化方案**:TLS 1.3 将握手从 2-RTT 优化到 1-RTT,支持 0-RTT 会话复用进一步提升性能。
---
## 七、总结记忆口诀🤝 三次握手建连接 一发二回三确认
🔐 TLS 握手保安全 证书验证换密钥 非对称换对称用 详见 /http/tls-ssl-handshake
👋 四次挥手断连接 一请二应三请四应
⏱️ TIME_WAIT 等 2MSL 保 ACK 达、清旧波
🛡️ SYN 攻击不用怕 Cookie 防御加限流
---
## 八、相关文档
- [TLS/SSL 握手与安全通信](/http/tls-ssl-handshake) - 深入了解 TLS 握手流程、版本对比、会话复用
- [HTTP1.1 vs HTTP2](/http/http1-vs-http2) - 了解应用层协议演进
- [从浏览器输入URL到页面渲染全过程](/http/url-to-render) - 了解完整网络流程